package com.mm.cme.kotlin_001.level03_object_oriented_program.delegate

import com.mm.cme.kotlin_001.utils.pd
import com.mm.cme.kotlin_001.utils.pl
import kotlin.reflect.KProperty

/**
 * Descriptions：属性代理
 * <p>
 * Author：ChenME
 * Date：2017/7/21
 * Email：ibelieve1210@163.com
 */
class DelegateMy {
    val hello by lazy { "Hello world!" }

    val string2 by X() // 使用 X 的 getValue 方法获取值

    var string3 by X() // 使用 X 的 getValue 方法获取值，并且使用 setValue 方法设置值
}

class X {

    private var value: String? = null

    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        pl("调用了 getValue() 方法：$thisRef -> ${property.name}")
        return value ?: ""
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        pl("调用了 setValue() 方法：$thisRef -> ${property.name} -> $value")
        this.value = value
    }
}

fun main(args: Array<String>) {
    val delegate = DelegateMy()
    pl(delegate.hello)

    pd()
    pl(delegate.string2)

    pd()
    delegate.string3 = "你好"

    pd()
    pl(delegate.string3)
}